<?php
/**
 * 线性表 顺序存储实现
 * User: liuqingwei
 * Date: 2020/3/30
 * Time: 上午12:07
 */

/**
ArrayIterator::current( void )      返回当前数组元素
ArrayIterator::current( void )      返回当前数组元素
ArrayIterator::key(void)            返回当前数组key
ArrayIterator::next (void)          指向下个数组元素
ArrayIterator::rewind(void )        重置数组指针到头
ArrayIterator::seek()               查找数组中某一位置
ArrayIterator::valid()              检查数组是否还包含其他元素
ArrayObject::append()               添加新元素
ArrayObject::__construct()          构造一个新的数组对象
ArrayObject::count()                返回迭代器中元素个数
ArrayObject::getIterator()          从一个数组对象构造一个新迭代器
ArrayObject::offsetExists(index)    判断提交的值是否存在
ArrayObject::offsetGet()            指定 name 获取值
ArrayObject::offsetSet()            修改指定 name 的值
ArrayObject::offsetUnset()          删除数据
 */

class LinearList extends ArrayObject
{
    
    public $list;//线性表
    
    /**
     * 初始化
     */
    public function __construct( $input = [], int $flags = 0, string $iterator_class = "ArrayIterator" )
    {
        parent::__construct($input, $flags, $iterator_class);
        $this->list = $this->getIterator();
    }
    
    /**
     * 析构
     */
    public function __destruct()
    {
        unset($this->list);
    }
    
    /**
     * 获取线性表的长度
     */
    public function getLength()
    {
        return $this->list->count();
    }
    
    /**
     * 获取线性表中下标为$key的元素
     *
     * @param int $key 索引
     *
     * @return mixed
     */
    public function getElementByKey($key)
    {
        return $this->list->offsetGet($key);
    }
    
    /**
     * 获取线性表某个元素的位置
     *
     * @param mixed $value 线性表的元素
     *
     * @return array
     */
    public function getKeyByValue($value)
    {
        $i = 0;
        $arr = [];
        $this->list->rewind();
        while($this->list->valid())
        {
            $tmp = $i++;
            if (strcmp($value,$this->list->current()) === 0)
            {
                $arr[] = $tmp;
            }
            
            $this->list->next();
        }
        
        return $arr;
    }
}